# Python面向对象编程：构造函数与self的使用

"""
1. 构造函数__init__的作用
- 构造函数是一个特殊的方法，在创建对象时自动调用
- 一般用于初始化对象的属性
- 可以接收参数，方便在创建对象时就设置属性值

2. self的作用和含义
- self代表类的实例本身
- 通过self可以访问实例的属性和方法
- Python会自动将实例本身作为第一个参数传递给实例方法
"""

# 创建一个Student类来演示构造函数和self的使用
class Student:
    def __init__(self, name, age, score):
        """构造函数
        参数:
            name: 学生姓名
            age: 学生年龄
            score: 学生分数
        """
        # 使用self来设置实例属性
        self.name = name    # 姓名属性
        self.age = age      # 年龄属性
        self.score = score  # 分数属性
    
    def show_info(self):
        """显示学生信息的方法
        通过self访问实例属性
        """
        print("学生信息：")
        print(f"姓名：{self.name}")
        print(f"年龄：{self.age}")
        print(f"分数：{self.score}")
    
    def study(self, subject):
        """学习方法
        参数:
            subject: 学习的科目
        """
        print(f"{self.name}正在学习{subject}")

# 创建Student类的实例
student1 = Student("张三", 18, 95)  # 调用构造函数，创建对象
student2 = Student("李四", 19, 88)

# 调用实例方法
print("===== 第一个学生 =====")
student1.show_info()  # Python会自动将student1作为self参数传递
student1.study("Python编程")

print("\n===== 第二个学生 =====")
student2.show_info()  # Python会自动将student2作为self参数传递
student2.study("数据结构")

"""
总结：
1. 构造函数__init__的特点：
   - 在创建对象时自动调用
   - 用于初始化对象的属性
   - 第一个参数必须是self

2. self的特点：
   - 代表类的实例本身
   - 可以通过self访问和修改实例的属性
   - Python会自动将实例作为self参数传递给方法
   - 方法的第一个参数必须是self（可以换名字，但不推荐）

3. 好处：
   - 构造函数让对象创建更灵活，可以在创建时就设置属性
   - self让方法能够访问对象的属性，实现数据和行为的结合
   - 代码更清晰，更容易维护
"""